--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RNS/Resource.py b051e76d00ab97baa948e69cdacadba3cf4739da (b051e76d) Text, 63.57 KB
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787RNS
Tff7b72import T7ee787os
Tff7b72import T7ee787bz2
Tff7b72import T7ee787math
Tff7b72import T7ee787time
Tff7b72import T7ee787struct
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787threading
Tff7b72from T7ee787threading Tff7b72import Te6edf3Lock
Tff7b72from T7ee787.T7ee787vendor Tff7b72import Te6edf3umsgpack Tff7b72as Te6edf3umsgpack
Tff7b72from T7ee787time Tff7b72import Te6edf3sleep
Tff7b72class T56d364ResourceTb4b4b4:
T8b949e"""
The Resource class allows transferring arbitrary amounts
of data over a link. It will automatically handle sequencing,
compression, coordination and checksumming.
:param data: The data to be transferred. Can be *bytes* or an open *file handle*. See the :ref:`Filetransfer Example<example-filetransfer>` for details.
:param link: The :ref:`RNS.Link<api-link>` instance on which to transfer the data.
:param advertise: Optional. Whether to automatically advertise the resource. Can be *True* or *False*.
:param auto_compress: Optional. Whether to auto-compress the resource. Can be *True* or *False*.
:param callback: An optional *callable* with the signature *callback(resource)*. Will be called when the resource transfer concludes.
:param progress_callback: An optional *callable* with the signature *callback(resource)*. Will be called whenever the resource transfer progress is updated.
"""
T8b949e# The initial window size at beginning of transfer
Te6edf3WINDOW Tff7b72= T79c0ff4
T8b949e# Absolute minimum window size during transfer
Te6edf3WINDOW_MIN Tff7b72= T79c0ff2
T8b949e# The maximum window size for transfers on slow links
Te6edf3WINDOW_MAX_SLOW Tff7b72= T79c0ff10
T8b949e# The maximum window size for transfers on very slow links
Te6edf3WINDOW_MAX_VERY_SLOW Tff7b72= T79c0ff4
T8b949e# The maximum window size for transfers on fast links
Te6edf3WINDOW_MAX_FAST Tff7b72= T79c0ff75
T8b949e# For calculating maps and guard segments, this
T8b949e# must be set to the global maximum window.
Te6edf3WINDOW_MAX Tff7b72= Te6edf3WINDOW_MAX_FAST
T8b949e# If the fast rate is sustained for this many request
T8b949e# rounds, the fast link window size will be allowed.
Te6edf3FAST_RATE_THRESHOLD Tff7b72= Te6edf3WINDOW_MAX_SLOW Tff7b72- Te6edf3WINDOW Tff7b72- T79c0ff2
T8b949e# If the very slow rate is sustained for this many request
T8b949e# rounds, window will be capped to the very slow limit.
Te6edf3VERY_SLOW_RATE_THRESHOLD Tff7b72= T79c0ff2
T8b949e# If the RTT rate is higher than this value,
T8b949e# the max window size for fast links will be used.
T8b949e# The default is 50 Kbps (the value is stored in
T8b949e# bytes per second, hence the "/ 8").
Te6edf3RATE_FAST Tff7b72= Tb4b4b4(T79c0ff50Tff7b72*T79c0ff1000Tb4b4b4) Tff7b72/ T79c0ff8
T8b949e# If the RTT rate is lower than this value,
T8b949e# the window size will be capped at .
T8b949e# The default is 50 Kbps (the value is stored in
T8b949e# bytes per second, hence the "/ 8").
Te6edf3RATE_VERY_SLOW Tff7b72= Tb4b4b4(T79c0ff2Tff7b72*T79c0ff1000Tb4b4b4) Tff7b72/ T79c0ff8
T8b949e# The minimum allowed flexibility of the window size.
T8b949e# The difference between window_max and window_min
T8b949e# will never be smaller than this value.
Te6edf3WINDOW_FLEXIBILITY Tff7b72= T79c0ff4
T8b949e# Number of bytes in a map hash
Te6edf3MAPHASH_LEN Tff7b72= T79c0ff4
Te6edf3SDU Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffMDU
Te6edf3RANDOM_HASH_SIZE Tff7b72= T79c0ff4
T8b949e# This is an indication of what the
T8b949e# maximum size a resource should be, if
T8b949e# it is to be handled within reasonable
T8b949e# time constraint, even on small systems.
T8b949e#
T8b949e# This constant will be used when determining
T8b949e# how to sequence the sending of large resources.
T8b949e#
T8b949e# Capped at 16777215 (0xFFFFFF) per segment to
T8b949e# fit in 3 bytes in resource advertisements.
Te6edf3MAX_EFFICIENT_SIZE Tff7b72= T79c0ff1 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024 Tff7b72- T79c0ff1
Te6edf3RESPONSE_MAX_GRACE_TIME Tff7b72= T79c0ff10
T8b949e# Max metadata size is 16777215 (0xFFFFFF) bytes
Te6edf3METADATA_MAX_SIZE Tff7b72= T79c0ff16 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024 Tff7b72- T79c0ff1
T8b949e# The maximum size to auto-compress with
T8b949e# bz2 before sending.
Te6edf3AUTO_COMPRESS_MAX_SIZE Tff7b72= T79c0ff64 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024
Te6edf3PART_TIMEOUT_FACTOR Tff7b72= T79c0ff4
Te6edf3PART_TIMEOUT_FACTOR_AFTER_RTT Tff7b72= T79c0ff2
Te6edf3PROOF_TIMEOUT_FACTOR Tff7b72= T79c0ff3
Te6edf3HMU_WAIT_FACTOR Tff7b72= T79c0ff3.5
Te6edf3MAX_RETRIES Tff7b72= T79c0ff16
Te6edf3MAX_ADV_RETRIES Tff7b72= T79c0ff4
Te6edf3SENDER_GRACE_TIME Tff7b72= T79c0ff10.0
Te6edf3PROCESSING_GRACE Tff7b72= T79c0ff1.0
Te6edf3RETRY_GRACE_TIME Tff7b72= T79c0ff0.25
Te6edf3PER_RETRY_DELAY Tff7b72= T79c0ff0.5
Te6edf3WATCHDOG_MAX_SLEEP Tff7b72= T79c0ff1
Te6edf3HASHMAP_IS_NOT_EXHAUSTED Tff7b72= T79c0ff0x00
Te6edf3HASHMAP_IS_EXHAUSTED Tff7b72= T79c0ff0xFF
T8b949e# Status constants
Te6edf3NONE Tff7b72= T79c0ff0x00
Te6edf3QUEUED Tff7b72= T79c0ff0x01
Te6edf3ADVERTISED Tff7b72= T79c0ff0x02
Te6edf3TRANSFERRING Tff7b72= T79c0ff0x03
Te6edf3AWAITING_PROOF Tff7b72= T79c0ff0x04
Te6edf3ASSEMBLING Tff7b72= T79c0ff0x05
Te6edf3COMPLETE Tff7b72= T79c0ff0x06
Te6edf3FAILED Tff7b72= T79c0ff0x07
Te6edf3CORRUPT Tff7b72= T79c0ff0x08
Te6edf3REJECTED Tff7b72= T79c0ff0x09
Tf0883e@staticmethod
Tff7b72def Td2a8ffrejectTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Te6edf3resource_hash Tff7b72= Te6edf3advTff7b72.Td2a8ffh
Te6edf3reject_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8fflinkTb4b4b4, Te6edf3resource_hashTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_RCLTb4b4b4)
Te6edf3reject_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error ocurred while rejecting advertised resource: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffacceptTb4b4b4(Te6edf3advertisement_packetTb4b4b4, Te6edf3callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3progress_callback Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3request_id Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Te6edf3resource Tff7b72= Te6edf3ResourceTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3advertisement_packetTff7b72.Td2a8fflinkTb4b4b4, Te6edf3request_id Tff7b72= Te6edf3request_idTb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRING
Te6edf3resourceTff7b72.Td2a8ffflags Tff7b72= Te6edf3advTff7b72.Td2a8fff
Te6edf3resourceTff7b72.Td2a8ffsize Tff7b72= Te6edf3advTff7b72.Td2a8fft
Te6edf3resourceTff7b72.Td2a8fftotal_size Tff7b72= Te6edf3advTff7b72.Td2a8ffd
Te6edf3resourceTff7b72.Td2a8ffuncompressed_size Tff7b72= Te6edf3advTff7b72.Td2a8ffd
Te6edf3resourceTff7b72.Td2a8ffhash Tff7b72= Te6edf3advTff7b72.Td2a8ffh
Te6edf3resourceTff7b72.Td2a8fforiginal_hash Tff7b72= Te6edf3advTff7b72.Td2a8ffo
Te6edf3resourceTff7b72.Td2a8ffrandom_hash Tff7b72= Te6edf3advTff7b72.Td2a8ffr
Te6edf3resourceTff7b72.Td2a8ffhashmap_raw Tff7b72= Te6edf3advTff7b72.Td2a8ffm
Te6edf3resourceTff7b72.Td2a8ffencrypted Tff7b72= Tff7b72True Tff7b72if Te6edf3resourceTff7b72.Td2a8ffflags Tff7b72& T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffcompressed Tff7b72= Tff7b72True Tff7b72if Te6edf3resourceTff7b72.Td2a8ffflags Tff7b72>> T79c0ff1 Tff7b72& T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffinitiator Tff7b72= Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Te6edf3resourceTff7b72.Td2a8ff__progress_callback Tff7b72= Te6edf3progress_callback
Te6edf3resourceTff7b72.Td2a8fftotal_parts Tff7b72= Tffa657intTb4b4b4(Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffsizeTff7b72/Tffa657floatTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffsduTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffreceived_count Tff7b72= T79c0ff0
Te6edf3resourceTff7b72.Td2a8ffoutstanding_parts Tff7b72= T79c0ff0
Te6edf3resourceTff7b72.Td2a8ffparts Tff7b72= Tb4b4b4[Tff7b72NoneTb4b4b4] Tff7b72* Te6edf3resourceTff7b72.Td2a8fftotal_parts
Te6edf3resourceTff7b72.Td2a8ffwindow Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW
Te6edf3resourceTff7b72.Td2a8ffwindow_max Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAX_SLOW
Te6edf3resourceTff7b72.Td2a8ffwindow_min Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MIN
Te6edf3resourceTff7b72.Td2a8ffwindow_flexibility Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_FLEXIBILITY
Te6edf3resourceTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffstarted_transferring Tff7b72= Te6edf3resourceTff7b72.Td2a8fflast_activity
Te6edf3resourceTff7b72.Td2a8ffadvertisement_packet Tff7b72= Te6edf3advertisement_packet
Te6edf3resourceTff7b72.Td2a8ffstoragepath Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffresourcepathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3resourceTff7b72.Td2a8fforiginal_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffmeta_storagepath Tff7b72= Te6edf3resourceTff7b72.Td2a8ffstoragepathTff7b72+Ta5d6ff"Ta5d6ff.metaTa5d6ff"
Te6edf3resourceTff7b72.Td2a8ffsegment_index Tff7b72= Te6edf3advTff7b72.Td2a8ffi
Te6edf3resourceTff7b72.Td2a8fftotal_segments Tff7b72= Te6edf3advTff7b72.Td2a8ffl
Tff7b72if Te6edf3advTff7b72.Td2a8ffl Tff7b72> T79c0ff1Tb4b4b4: Te6edf3resourceTff7b72.Td2a8ffsplit Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3resourceTff7b72.Td2a8ffsplit Tff7b72= Tff7b72False
Tff7b72if Te6edf3advTff7b72.Td2a8ffxTb4b4b4: Te6edf3resourceTff7b72.Td2a8ffhas_metadata Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4: Te6edf3resourceTff7b72.Td2a8ffhas_metadata Tff7b72= Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffhashmap Tff7b72= Tb4b4b4[Tff7b72NoneTb4b4b4] Tff7b72* Te6edf3resourceTff7b72.Td2a8fftotal_parts
Te6edf3resourceTff7b72.Td2a8ffhashmap_height Tff7b72= T79c0ff0
Te6edf3resourceTff7b72.Td2a8ffwaiting_for_hmu Tff7b72= Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffreceiving_part Tff7b72= Tff7b72False
Te6edf3resourceTff7b72.Td2a8ffconsecutive_completed_height Tff7b72= Tff7b72-T79c0ff1
Te6edf3previous_window Tff7b72= Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffget_last_resource_windowTb4b4b4(Tb4b4b4)
Te6edf3previous_eifr Tff7b72= Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffget_last_resource_eifrTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3previous_windowTb4b4b4:
Te6edf3resourceTff7b72.Td2a8ffwindow Tff7b72= Te6edf3previous_window
Tff7b72if Te6edf3previous_eifrTb4b4b4:
Te6edf3resourceTff7b72.Td2a8ffprevious_eifr Tff7b72= Te6edf3previous_eifr
Tff7b72if Tff7b72not Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffhas_incoming_resourceTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffregister_incoming_resourceTb4b4b4(Te6edf3resourceTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAccepting resource advertisement for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff. Transfer size is Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffsizeTb4b4b4)Tffd700}Ta5d6ff in Tffd700{Te6edf3resourceTff7b72.Td2a8fftotal_partsTffd700}Ta5d6ff parts.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffresource_started Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffcallbacksTff7b72.Td2a8ffresource_startedTb4b4b4(Te6edf3resourceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing resource started callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3resourceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffhashmap_updateTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3resourceTff7b72.Td2a8ffhashmap_rawTb4b4b4)
Te6edf3resourceTff7b72.Td2a8ffwatchdog_jobTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3resource
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIgnoring resource advertisement for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, resource already transferringTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not decode resource advertisement, dropping resource: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72return Tff7b72None
T8b949e# Create a resource for transmission to a remote destination
T8b949e# The data passed can be either a bytes-array or a file opened
T8b949e# in binary read mode.
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3metadataTff7b72=Tff7b72NoneTb4b4b4, Te6edf3advertiseTff7b72=Tff7b72TrueTb4b4b4, Te6edf3auto_compressTff7b72=Tff7b72TrueTb4b4b4, Te6edf3callbackTff7b72=Tff7b72NoneTb4b4b4, Te6edf3progress_callbackTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3timeout Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3segment_index Tff7b72= T79c0ff1Tb4b4b4, Te6edf3original_hash Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3request_id Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3is_response Tff7b72= Tff7b72FalseTb4b4b4, Te6edf3sent_metadata_sizeTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3data_size Tff7b72= Tff7b72None
Te6edf3resource_data Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffassembly_lock Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffpreparing_next_segment Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffnext_segment Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmetadata Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffhas_metadata Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffmetadata_size Tff7b72= Te6edf3sent_metadata_size
Tff7b72if Te6edf3metadata Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3packed_metadata Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3metadataTb4b4b4)
Te6edf3metadata_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3packed_metadataTb4b4b4)
Tff7b72if Te6edf3metadata_size Tff7b72> Te6edf3ResourceTff7b72.Td2a8ffMETADATA_MAX_SIZETb4b4b4:
Tff7b72raise Tf85149SystemErrorTb4b4b4(Ta5d6ff"Ta5d6ffResource metadata size exceededTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmetadata Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff>ITa5d6ff"Tb4b4b4, Te6edf3metadata_sizeTb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4] Tff7b72+ Te6edf3packed_metadata
Tff7b72selfTff7b72.Td2a8ffmetadata_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmetadataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhas_metadata Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmetadata Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72if Te6edf3sent_metadata_size Tff7b72> T79c0ff0Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhas_metadata Tff7b72= Tff7b72True
Tff7b72if Te6edf3data Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3dataTb4b4b4, Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffmetadata_size Tff7b72+ Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETb4b4b4:
Te6edf3original_data Tff7b72= Te6edf3data
Te6edf3data_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3original_dataTb4b4b4)
Te6edf3data Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffTemporaryFileTb4b4b4(Tb4b4b4)
Te6edf3dataTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3original_dataTb4b4b4)
Tff7b72del Te6edf3original_data
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3dataTb4b4b4, Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3data_size Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3data_size Tff7b72= Te6edf3osTff7b72.Td2a8ffstatTb4b4b4(Te6edf3dataTff7b72.Td2a8ffnameTb4b4b4)Tff7b72.Td2a8ffst_size
Tff7b72selfTff7b72.Td2a8fftotal_size Tff7b72= Te6edf3data_size Tff7b72+ Tff7b72selfTff7b72.Td2a8ffmetadata_size
Tff7b72if Tff7b72selfTff7b72.Td2a8fftotal_size Tff7b72<Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETb4b4b4:
Tff7b72selfTff7b72.Td2a8fftotal_segments Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsplit Tff7b72= Tff7b72False
Te6edf3resource_data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3dataTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# self.total_segments = ((data_size-1)//Resource.MAX_EFFICIENT_SIZE)+1
T8b949e# self.segment_index = segment_index
T8b949e# self.split = True
T8b949e# seek_index = segment_index-1
T8b949e# seek_position = seek_index*Resource.MAX_EFFICIENT_SIZE
Tff7b72selfTff7b72.Td2a8fftotal_segments Tff7b72= Tb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftotal_sizeTff7b72-T79c0ff1Tb4b4b4)Tff7b72/Tff7b72/Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETb4b4b4)Tff7b72+T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72= Te6edf3segment_index
Tff7b72selfTff7b72.Td2a8ffsplit Tff7b72= Tff7b72True
Te6edf3seek_index Tff7b72= Te6edf3segment_indexTff7b72-T79c0ff1
Te6edf3first_read_size Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZE Tff7b72- Tff7b72selfTff7b72.Td2a8ffmetadata_size
Tff7b72if Te6edf3segment_index Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3seek_position Tff7b72= T79c0ff0
Te6edf3segment_read_size Tff7b72= Te6edf3first_read_size
Tff7b72elseTb4b4b4:
Te6edf3seek_position Tff7b72= Te6edf3first_read_size Tff7b72+ Tb4b4b4(Tb4b4b4(Te6edf3seek_indexTff7b72-T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETb4b4b4)
Te6edf3segment_read_size Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZE
Te6edf3dataTff7b72.Td2a8ffseekTb4b4b4(Te6edf3seek_positionTb4b4b4)
Te6edf3resource_data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreadTb4b4b4(Te6edf3segment_read_sizeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinput_file Tff7b72= Te6edf3data
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657bytesTb4b4b4)Tb4b4b4:
Te6edf3data_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftotal_size Tff7b72= Te6edf3data_size Tff7b72+ Tff7b72selfTff7b72.Td2a8ffmetadata_size
Te6edf3resource_data Tff7b72= Te6edf3data
Tff7b72selfTff7b72.Td2a8fftotal_segments Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsplit Tff7b72= Tff7b72False
Tff7b72elif Te6edf3data Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72pass
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data instance type passed to resource initialisationTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3resource_dataTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_metadataTb4b4b4: Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ffmetadata Tff7b72+ Te6edf3resource_data
Tff7b72elseTb4b4b4: Te6edf3data Tff7b72= Te6edf3resource_data
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffNONE
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Te6edf3link
Tff7b72if Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffmtuTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsdu Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffmtu Tff7b72- Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffHEADER_MAXSIZE Tff7b72- Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffIFAC_MIN_SIZE
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsdu Tff7b72= Te6edf3linkTff7b72.Td2a8ffmdu Tff7b72or Te6edf3ResourceTff7b72.Td2a8ffSDU
Tff7b72selfTff7b72.Td2a8ffmax_retries Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffMAX_RETRIES
Tff7b72selfTff7b72.Td2a8ffmax_adv_retries Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffMAX_ADV_RETRIES
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries
Tff7b72selfTff7b72.Td2a8fftimeout_factor Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8fftraffic_timeout_factor
Tff7b72selfTff7b72.Td2a8ffpart_timeout_factor Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffPART_TIMEOUT_FACTOR
Tff7b72selfTff7b72.Td2a8ffsender_grace_time Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffSENDER_GRACE_TIME
Tff7b72selfTff7b72.Td2a8ffhmu_retry_ok Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffwatchdog_lock Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff__watchdog_job_id Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff__progress_callback Tff7b72= Te6edf3progress_callback
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffreq_sent Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffreq_resp_rtt_rate Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes_at_part_req Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffreq_data_rtt_rate Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffeifr Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffprevious_eifr Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffvery_slow_rate_rounds Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffrequest_id Tff7b72= Te6edf3request_id
Tff7b72selfTff7b72.Td2a8ffstarted_transferring Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffis_response Tff7b72= Te6edf3is_response
Tff7b72selfTff7b72.Td2a8ffmax_decompressed_size Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffAUTO_COMPRESS_MAX_SIZE
Tff7b72selfTff7b72.Td2a8ffauto_compress_limit Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffAUTO_COMPRESS_MAX_SIZE
Tff7b72selfTff7b72.Td2a8ffauto_compress_option Tff7b72= Te6edf3auto_compress
Tff7b72if Tffa657typeTb4b4b4(Te6edf3auto_compressTb4b4b4) Tff7b72== Tffa657boolTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffauto_compress Tff7b72= Te6edf3auto_compress
Tff7b72elif Tffa657typeTb4b4b4(Te6edf3auto_compressTb4b4b4) Tff7b72== Tffa657intTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffauto_compress Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffauto_compress_limit Tff7b72= Te6edf3auto_compress
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid type Tffd700{Tffa657typeTb4b4b4(Te6edf3auto_compressTb4b4b4)Tffd700}Ta5d6ff for auto_compress optionTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreq_hashlist Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_height Tff7b72= T79c0ff0
Tff7b72if Te6edf3timeout Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftimeout Tff7b72= Te6edf3timeout
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftimeout Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrtt Tff7b72* Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8fftraffic_timeout_factor
Tff7b72if Te6edf3data Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffinitiator Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Tff7b72selfTff7b72.Td2a8ffuncompressed_data Tff7b72= Te6edf3data
Te6edf3compression_began Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffauto_compress Tff7b72and Te6edf3data_size Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffauto_compress_limitTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompressing resource data...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcompressed_data Tff7b72= Te6edf3bz2Tff7b72.Td2a8ffcompressTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuncompressed_dataTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompression completed in Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3compression_beganTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff secondsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcompressed_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffuncompressed_data
Tff7b72selfTff7b72.Td2a8ffuncompressed_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuncompressed_dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcompressed_size Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcompressed_dataTb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffcompressed_size Tff7b72< Tff7b72selfTff7b72.Td2a8ffuncompressed_size Tff7b72and Te6edf3auto_compressTb4b4b4)Tb4b4b4:
Te6edf3saved_bytes Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuncompressed_dataTb4b4b4) Tff7b72- Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcompressed_dataTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompression saved Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3saved_bytesTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff bytes, sending compressedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffRANDOM_HASH_SIZETb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffcompressed_data
Tff7b72selfTff7b72.Td2a8ffcompressed Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72+Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffRANDOM_HASH_SIZETb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffuncompressed_data
Tff7b72selfTff7b72.Td2a8ffcompressed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffcompressed_data Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffauto_compress Tff7b72and Te6edf3data_size Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffauto_compress_limitTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCompression did not decrease size, sending uncompressedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcompressed_data Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffuncompressed_data Tff7b72= Tff7b72None
T8b949e# Resources handle encryption directly to
T8b949e# make optimal use of packet MTU on an entire
T8b949e# encrypted stream. The Resource instance will
T8b949e# use it's underlying link directly to encrypt.
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffencryptTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffencrypted Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffsize Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsent_parts Tff7b72= T79c0ff0
Te6edf3hashmap_entries Tff7b72= Tffa657intTb4b4b4(Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsizeTff7b72/Tffa657floatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsduTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftotal_parts Tff7b72= Te6edf3hashmap_entries
Te6edf3hashmap_ok Tff7b72= Tff7b72False
Tff7b72while Tff7b72not Te6edf3hashmap_okTb4b4b4:
Te6edf3hashmap_computation_began Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting resource hashmap computation with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hashmap_entriesTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff entries...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrandom_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffget_random_hashTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffRANDOM_HASH_SIZETb4b4b4]
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3dataTff7b72+Tff7b72selfTff7b72.Td2a8ffrandom_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftruncated_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fftruncated_hashTb4b4b4(Te6edf3dataTff7b72+Tff7b72selfTff7b72.Td2a8ffrandom_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffexpected_proof Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3dataTff7b72+Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72if Te6edf3original_hash Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fforiginal_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fforiginal_hash Tff7b72= Te6edf3original_hash
Tff7b72selfTff7b72.Td2a8ffparts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffhashmap Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3collision_guard_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4,Te6edf3hashmap_entriesTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4[Te6edf3iTff7b72*Tff7b72selfTff7b72.Td2a8ffsduTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Tff7b72selfTff7b72.Td2a8ffsduTb4b4b4]
Te6edf3map_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_map_hashTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Te6edf3map_hash Tff7b72in Te6edf3collision_guard_listTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFound hash collision in resource map, remapping...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3hashmap_ok Tff7b72= Tff7b72False
Tff7b72break
Tff7b72elseTb4b4b4:
Te6edf3hashmap_ok Tff7b72= Tff7b72True
Te6edf3collision_guard_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3map_hashTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3collision_guard_listTb4b4b4) Tff7b72> Te6edf3ResourceAdvertisementTff7b72.Td2a8ffCOLLISION_GUARD_SIZETb4b4b4:
Te6edf3collision_guard_listTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3part Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCETb4b4b4)
Te6edf3partTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3partTff7b72.Td2a8ffmap_hash Tff7b72= Te6edf3map_hash
Tff7b72selfTff7b72.Td2a8ffhashmap Tff7b72+Tff7b72= Te6edf3partTff7b72.Td2a8ffmap_hash
Tff7b72selfTff7b72.Td2a8ffpartsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3partTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffHashmap computation concluded in Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3hashmap_computation_beganTb4b4b4, T79c0ff3Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff secondsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Tff7b72None
Tff7b72if Te6edf3advertiseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadvertiseTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceive_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffhashmap_update_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3plaintextTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmuTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries
Te6edf3update Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3plaintextTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhashmap_updateTb4b4b4(Te6edf3updateTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3updateTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffhashmap_updateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3segmentTb4b4b4, Te6edf3hashmapTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRING
Te6edf3seg_len Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN
Te6edf3hashes Tff7b72= Tffa657lenTb4b4b4(Te6edf3hashmapTb4b4b4)Tff7b72/Tff7b72/Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LEN
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4,Te6edf3hashesTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3iTff7b72+Te6edf3segmentTff7b72*Te6edf3seg_lenTb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffhashmap_height Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3iTff7b72+Te6edf3segmentTff7b72*Te6edf3seg_lenTb4b4b4] Tff7b72= Te6edf3hashmapTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]
Tff7b72if Te6edf3hashes Tff7b72< T79c0ff1Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInvalid HMU received, cancelling transferTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmu Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffrequest_nextTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffget_map_hashTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3dataTff7b72+Tff7b72selfTff7b72.Td2a8ffrandom_hashTb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]
Tff7b72def Td2a8ffadvertiseTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
Advertise the resource. If the other end of the link accepts
the resource advertisement it will begin transferring.
"""
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__advertise_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72< Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4:
Te6edf3prepare_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__prepare_next_segmentTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3prepare_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffensure_linkTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8fflink Tff7b72or Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid link state for Tffd700{Tff7b72selfTffd700}Ta5d6ff, aborting transferTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while cancelling resource on link-state abort: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72True
Tff7b72def Td2a8ff__advertise_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadvertisement_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3ResourceAdvertisementTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_ADVTb4b4b4)
Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffready_for_new_resourceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffQUEUED
Te6edf3sleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffensure_linkTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72selfTff7b72.Td2a8ffadvertisement_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstarted_transferring Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Tff7b72selfTff7b72.Td2a8ffadv_sent Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffADVERTISED
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_adv_retries
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffregister_outgoing_resourceTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSent resource advertisement for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4) Tff7b72else Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not advertise resource, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72return
Tff7b72selfTff7b72.Td2a8ffwatchdog_jobTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffupdate_eifrTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3rtt Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrtt
Tff7b72elseTb4b4b4: Te6edf3rtt Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt
Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_data_rtt_rate Tff7b72!= T79c0ff0Tb4b4b4: Te6edf3expected_inflight_rate Tff7b72= Tff7b72selfTff7b72.Td2a8ffreq_data_rtt_rateTff7b72*T79c0ff8
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprevious_eifr Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3expected_inflight_rate Tff7b72= Tff7b72selfTff7b72.Td2a8ffprevious_eifr
Tff7b72elseTb4b4b4: Te6edf3expected_inflight_rate Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffestablishment_costTff7b72*T79c0ff8 Tff7b72/ Te6edf3rtt
Tff7b72selfTff7b72.Td2a8ffeifr Tff7b72= Te6edf3expected_inflight_rate
Tff7b72if Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4: Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffexpected_rate Tff7b72= Tff7b72selfTff7b72.Td2a8ffeifr
Tff7b72def Td2a8ffwatchdog_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__watchdog_jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__watchdog_jobTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__watchdog_job_id Tff7b72+Tff7b72= T79c0ff1
Te6edf3this_job_id Tff7b72= Tff7b72selfTff7b72.Td2a8ff__watchdog_job_id
Tff7b72while Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffASSEMBLING Tff7b72and Te6edf3this_job_id Tff7b72== Tff7b72selfTff7b72.Td2a8ff__watchdog_job_idTb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffwatchdog_lockTb4b4b4: Te6edf3sleepTb4b4b4(T79c0ff0.025Tb4b4b4)
Te6edf3sleep_time Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffADVERTISEDTb4b4b4:
Te6edf3sleep_time Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffadv_sentTff7b72+Tff7b72selfTff7b72.Td2a8fftimeoutTff7b72+Te6edf3ResourceTff7b72.Td2a8ffPROCESSING_GRACETb4b4b4)Tff7b72-Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource transfer timeout after sending advertisementTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo part requests received, retrying resource advertisement...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffensure_linkTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72selfTff7b72.Td2a8ffadvertisement_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3ResourceAdvertisementTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_ADVTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadvertisement_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadv_sent Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not resend advertisement packet, cancelling resource. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRINGTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Te6edf3retries_used Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries Tff7b72- Tff7b72selfTff7b72.Td2a8ffretries_left
Te6edf3extra_wait Tff7b72= Te6edf3retries_used Tff7b72* Te6edf3ResourceTff7b72.Td2a8ffPER_RETRY_DELAY
Tff7b72selfTff7b72.Td2a8ffupdate_eifrTb4b4b4(Tb4b4b4)
Te6edf3expected_hmu_wait_remaining Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffsduTff7b72*T79c0ff8Tff7b72*Tff7b72selfTff7b72.Td2a8ffHMU_WAIT_FACTORTb4b4b4)Tff7b72/Tff7b72selfTff7b72.Td2a8ffeifr Tff7b72if Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmu Tff7b72or Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72== T79c0ff0 Tff7b72else T79c0ff0
Te6edf3expected_tof_remaining Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutstanding_partsTff7b72*Tff7b72selfTff7b72.Td2a8ffsduTff7b72*T79c0ff8Tb4b4b4)Tff7b72/Tff7b72selfTff7b72.Td2a8ffeifr
Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_resp_rtt_rate Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3sleep_time Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72+ Tff7b72selfTff7b72.Td2a8ffpart_timeout_factorTff7b72*Te6edf3expected_tof_remaining Tff7b72+ Te6edf3expected_hmu_wait_remaining Tff7b72+ Te6edf3ResourceTff7b72.Td2a8ffRETRY_GRACE_TIME Tff7b72+ Te6edf3extra_wait Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3sleep_time Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72+ Tff7b72selfTff7b72.Td2a8ffpart_timeout_factorTff7b72*Tb4b4b4(Tb4b4b4(T79c0ff3Tff7b72*Tff7b72selfTff7b72.Td2a8ffsduTb4b4b4)Tff7b72/Tff7b72selfTff7b72.Td2a8ffeifrTb4b4b4) Tff7b72+ Te6edf3ResourceTff7b72.Td2a8ffRETRY_GRACE_TIME Tff7b72+ Te6edf3extra_wait Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
T8b949e# TODO: Remove debug at some point
T8b949e# RNS.log(f"EIFR {RNS.prettyspeed(self.eifr)}, ETOF {RNS.prettyshorttime(expected_tof_remaining)}, EHWR {RNS.prettyshorttime(expected_hmu_wait_remaining)}", RNS.LOG_DEBUG, pt=True)
T8b949e# RNS.log(f"Resource ST {RNS.prettyshorttime(sleep_time)}, RTT {RNS.prettyshorttime(self.rtt or self.link.rtt)}, {self.outstanding_parts} left", RNS.LOG_DEBUG, pt=True)
Tff7b72if Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff" Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimed out waiting for Tffd700{Tff7b72selfTff7b72.Td2a8ffoutstanding_partsTffd700}Ta5d6ff partTffd700{Te6edf3msTffd700}Ta5d6ff, requesting retry on Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72> Tff7b72selfTff7b72.Td2a8ffwindow_minTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72> Tff7b72selfTff7b72.Td2a8ffwindow_minTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72- Tff7b72selfTff7b72.Td2a8ffwindowTb4b4b4) Tff7b72> Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwindow_flexibilityTff7b72-T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72-Tff7b72= T79c0ff1
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72-Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmu Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffrequest_nextTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72elseTb4b4b4:
Te6edf3max_extra_wait Tff7b72= Tffa657sumTb4b4b4(Tb4b4b4[Tb4b4b4(Te6edf3rTff7b72+T79c0ff1Tb4b4b4) Tff7b72* Te6edf3ResourceTff7b72.Td2a8ffPER_RETRY_DELAY Tff7b72for Te6edf3r Tff7b72in Tffa657rangeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffMAX_RETRIESTb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3max_wait Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72* Tff7b72selfTff7b72.Td2a8fftimeout_factor Tff7b72* Tff7b72selfTff7b72.Td2a8ffmax_retries Tff7b72+ Tff7b72selfTff7b72.Td2a8ffsender_grace_time Tff7b72+ Te6edf3max_extra_wait
Te6edf3sleep_time Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72+ Te6edf3max_wait Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource timed out waiting for part requestsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffAWAITING_PROOFTb4b4b4:
T8b949e# Decrease timeout factor since proof packets are
T8b949e# significantly smaller than full req/resp roundtrip
Tff7b72selfTff7b72.Td2a8fftimeout_factor Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffPROOF_TIMEOUT_FACTOR
Te6edf3sleep_time Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_part_sent Tff7b72+ Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffrttTff7b72*Tff7b72selfTff7b72.Td2a8fftimeout_factorTff7b72+Tff7b72selfTff7b72.Td2a8ffsender_grace_timeTb4b4b4) Tff7b72- Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72<Tff7b72= T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource timed out waiting for proofTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAll parts sent, but no resource proof received, querying network cache...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72-Tff7b72= T79c0ff1
Te6edf3expected_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffhash Tff7b72+ Tff7b72selfTff7b72.Td2a8ffexpected_proof
Te6edf3expected_proof_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3expected_dataTb4b4b4, Te6edf3packet_typeTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPROOFTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_PRFTb4b4b4)
Te6edf3expected_proof_packetTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffcache_requestTb4b4b4(Te6edf3expected_proof_packetTff7b72.Td2a8ffpacket_hashTb4b4b4, Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_part_sent Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72>Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffASSEMBLINGTb4b4b4:
Te6edf3sleep_time Tff7b72= T79c0ff0.001
Tff7b72if Te6edf3sleep_time Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffWarning! Link watchdog sleep time of 0!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3sleep_time Tff7b72== Tff7b72None Tff7b72or Te6edf3sleep_time Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTiming error (Tffd700{Te6edf3sleep_timeTffd700}Ta5d6ff/Tffd700{Tff7b72selfTff7b72.Td2a8ffstatusTffd700}Ta5d6ff), cancelling resource transfer.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3sleep_time Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3sleepTb4b4b4(Tffa657minTb4b4b4(Te6edf3sleep_timeTb4b4b4, Te6edf3ResourceTff7b72.Td2a8ffWATCHDOG_MAX_SLEEPTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffassembleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffASSEMBLING
Te6edf3stream Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffencryptedTb4b4b4: Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffdecryptTb4b4b4(Te6edf3streamTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3data Tff7b72= Te6edf3stream
T8b949e# Strip off random hash
Te6edf3data Tff7b72= Te6edf3dataTb4b4b4[Te6edf3ResourceTff7b72.Td2a8ffRANDOM_HASH_SIZETb4b4b4:Tb4b4b4]
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffcompressedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Te6edf3data
Tff7b72elseTb4b4b4:
Te6edf3decompressor Tff7b72= Te6edf3bz2Tff7b72.Td2a8ffBZ2DecompressorTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Te6edf3decompressorTff7b72.Td2a8ffdecompressTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3max_lengthTff7b72=Tff7b72selfTff7b72.Td2a8ffmax_decompressed_sizeTb4b4b4)
Tff7b72if Tff7b72not Te6edf3decompressorTff7b72.Td2a8ffeofTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCORRUPT
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDecompressed resource exceeded maximum decompressed size. The resource was rejected.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return
Te6edf3calculated_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTff7b72+Tff7b72selfTff7b72.Td2a8ffrandom_hashTb4b4b4)
Tff7b72if Te6edf3calculated_hash Tff7b72== Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhas_metadata Tff7b72and Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72== T79c0ff1Tb4b4b4:
T8b949e# TODO: Add early metadata_ready callback
Te6edf3metadata_size Tff7b72= Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<< T79c0ff16 Tff7b72| Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<< T79c0ff8 Tff7b72| Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3packed_metadata Tff7b72= Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4[T79c0ff3Tb4b4b4:T79c0ff3Tff7b72+Te6edf3metadata_sizeTb4b4b4]
Te6edf3metadata_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmeta_storagepathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3metadata_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3packed_metadataTb4b4b4)
Te6edf3metadata_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72del Te6edf3packed_metadata
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4[T79c0ff3Tff7b72+Te6edf3metadata_sizeTb4b4b4:Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ffdata
Tff7b72selfTff7b72.Td2a8fffile Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Ta5d6ff"Ta5d6ffabTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8fffileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCOMPLETE
Tff7b72del Te6edf3data
Tff7b72selfTff7b72.Td2a8ffproveTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCORRUPT
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while assembling received resource.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCORRUPT
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72== Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmeta_storagepathTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmetadata Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3metadata_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmeta_storagepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmetadata Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3metadata_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3metadata_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmeta_storagepathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while cleaning up resource metadata file, the contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing resource assembled callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4, Ta5d6ff"Ta5d6ffcloseTa5d6ff"Tb4b4b4) Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTff7b72.Td2a8ffcloseTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdataTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4: Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while cleaning up resource files, the contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource segment Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsegment_indexTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff of Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff received, waiting for next segment to be announcedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72def Td2a8ffproveTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3proof Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdataTff7b72+Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4)
Te6edf3proof_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72+Te6edf3proof
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffensure_linkTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Te6edf3proof_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3proof_dataTb4b4b4, Te6edf3packet_typeTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffPROOFTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_PRFTb4b4b4)
Te6edf3proof_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffcacheTb4b4b4(Te6edf3proof_packetTb4b4b4, Te6edf3force_cacheTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send proof packet, cancelling resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff__prepare_next_segmentTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# Prepare the next segment for advertisement
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPreparing segment Tffd700{Tff7b72selfTff7b72.Td2a8ffsegment_indexTff7b72+T79c0ff1Tffd700}Ta5d6ff of Tffd700{Tff7b72selfTff7b72.Td2a8fftotal_segmentsTffd700}Ta5d6ff for resource Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpreparing_next_segment Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffnext_segment Tff7b72= Te6edf3ResourceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinput_fileTb4b4b4, Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4,
Te6edf3callback Tff7b72= Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4,
Te6edf3segment_index Tff7b72= Tff7b72selfTff7b72.Td2a8ffsegment_indexTff7b72+T79c0ff1Tb4b4b4,
Te6edf3original_hashTff7b72=Tff7b72selfTff7b72.Td2a8fforiginal_hashTb4b4b4,
Te6edf3progress_callback Tff7b72= Tff7b72selfTff7b72.Td2a8ff__progress_callbackTb4b4b4,
Te6edf3request_id Tff7b72= Tff7b72selfTff7b72.Td2a8ffrequest_idTb4b4b4,
Te6edf3is_response Tff7b72= Tff7b72selfTff7b72.Td2a8ffis_responseTb4b4b4,
Te6edf3advertise Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3auto_compress Tff7b72= Tff7b72selfTff7b72.Td2a8ffauto_compress_optionTb4b4b4,
Te6edf3sent_metadata_size Tff7b72= Tff7b72selfTff7b72.Td2a8ffmetadata_sizeTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__progress_callbackTb4b4b4: Tff7b72selfTff7b72.Td2a8ffnext_segmentTff7b72.Td2a8ffprogress_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__progress_callbackTb4b4b4)
Tff7b72def Td2a8ffvalidate_proofTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3proof_dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3proof_dataTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72if Te6edf3proof_dataTb4b4b4[Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffexpected_proofTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffCOMPLETE
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72== Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4:
T8b949e# If all segments were processed, we'll
T8b949e# signal that the resource sending concluded
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing resource concluded callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffinput_fileTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinput_fileTb4b4b4, Ta5d6ff"Ta5d6ffcloseTa5d6ff"Tb4b4b4) Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinput_fileTff7b72.Td2a8ffcloseTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffinput_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while closing resource input file: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffinput_fileTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinput_fileTb4b4b4, Ta5d6ff"Ta5d6ffcloseTa5d6ff"Tb4b4b4) Tff7b72and Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinput_fileTff7b72.Td2a8ffcloseTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffinput_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while closing resource input file: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Otherwise we'll recursively create the
T8b949e# next segment of the resource
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpreparing_next_segmentTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNext segment preparation for resource Tffd700{Tff7b72selfTffd700}Ta5d6ff was not started yet, manually preparing now. This will cause transfer slowdown.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff__prepare_next_segmentTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8ffnext_segment Tff7b72== Tff7b72NoneTb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdata Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmetadata Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffparts Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffinput_file Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffreq_hashlist Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffhashmap Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnext_segmentTff7b72.Td2a8ffadvertiseTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffreceive_partTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffreceive_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceiving_part Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries
Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_resp Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreq_resp Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Te6edf3rtt Tff7b72= Tff7b72selfTff7b72.Td2a8ffreq_respTff7b72-Tff7b72selfTff7b72.Td2a8ffreq_sent
Tff7b72selfTff7b72.Td2a8ffpart_timeout_factor Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffPART_TIMEOUT_FACTOR_AFTER_RTT
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrtt
Tff7b72selfTff7b72.Td2a8ffwatchdog_jobTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3rtt Tff7b72< Tff7b72selfTff7b72.Td2a8ffrttTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tffa657maxTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72- Tff7b72selfTff7b72.Td2a8ffrttTff7b72*T79c0ff0.05Tb4b4b4, Te6edf3rttTb4b4b4)
Tff7b72elif Te6edf3rtt Tff7b72> Tff7b72selfTff7b72.Td2a8ffrttTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Tffa657minTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72+ Tff7b72selfTff7b72.Td2a8ffrttTff7b72*T79c0ff0.05Tb4b4b4, Te6edf3rttTb4b4b4)
Tff7b72if Te6edf3rtt Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3req_resp_cost Tff7b72= Tffa657lenTb4b4b4(Te6edf3packetTff7b72.Td2a8ffrawTb4b4b4)Tff7b72+Tff7b72selfTff7b72.Td2a8ffreq_sent_bytes
Tff7b72selfTff7b72.Td2a8ffreq_resp_rtt_rate Tff7b72= Te6edf3req_resp_cost Tff7b72/ Te6edf3rtt
Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_resp_rtt_rate Tff7b72> Te6edf3ResourceTff7b72.Td2a8ffRATE_FAST Tff7b72and Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffFAST_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAST_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAX_FAST
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRING
Te6edf3part_data Tff7b72= Te6edf3packetTff7b72.Td2a8ffdata
Te6edf3part_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_map_hashTb4b4b4(Te6edf3part_dataTb4b4b4)
Te6edf3consecutive_index Tff7b72= Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72if Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72>Tff7b72= T79c0ff0 Tff7b72else T79c0ff0
Te6edf3i Tff7b72= Te6edf3consecutive_index
Tff7b72for Te6edf3map_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3consecutive_indexTb4b4b4:Te6edf3consecutive_indexTff7b72+Tff7b72selfTff7b72.Td2a8ffwindowTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3map_hash Tff7b72== Te6edf3part_hashTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3iTb4b4b4] Tff7b72== Tff7b72NoneTb4b4b4:
T8b949e# Insert data into parts list
Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3part_data
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3part_dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreceived_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72-Tff7b72= T79c0ff1
T8b949e# Update consecutive completed pointer
Tff7b72if Te6edf3i Tff7b72== Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72+ T79c0ff1Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72= Te6edf3i
Te6edf3cp Tff7b72= Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72+ T79c0ff1
Tff7b72while Te6edf3cp Tff7b72< Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3cpTb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_height Tff7b72= Te6edf3cp
Te6edf3cp Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__progress_callback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__progress_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing progress callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffreceiving_part Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffreceived_count Tff7b72== Tff7b72selfTff7b72.Td2a8fftotal_parts Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffassembly_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffassembly_lock Tff7b72= Tff7b72True
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffassembleTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# TODO: Figure out if there is a mathematically
T8b949e# optimal way to adjust windows
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72< Tff7b72selfTff7b72.Td2a8ffwindow_maxTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72- Tff7b72selfTff7b72.Td2a8ffwindow_minTb4b4b4) Tff7b72> Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffwindow_flexibilityTff7b72-T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_min Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_sent Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3rtt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Tff7b72selfTff7b72.Td2a8ffreq_sent
Te6edf3req_transferred Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes Tff7b72- Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes_at_part_req
Tff7b72if Te6edf3rtt Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreq_data_rtt_rate Tff7b72= Te6edf3req_transferredTff7b72/Te6edf3rtt
Tff7b72selfTff7b72.Td2a8ffupdate_eifrTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes_at_part_req Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes
Tff7b72if Tff7b72selfTff7b72.Td2a8ffreq_data_rtt_rate Tff7b72> Te6edf3ResourceTff7b72.Td2a8ffRATE_FAST Tff7b72and Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffFAST_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAST_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAX_FAST
Tff7b72if Tff7b72selfTff7b72.Td2a8fffast_rate_rounds Tff7b72== T79c0ff0 Tff7b72and Tff7b72selfTff7b72.Td2a8ffreq_data_rtt_rate Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffRATE_VERY_SLOW Tff7b72and Tff7b72selfTff7b72.Td2a8ffvery_slow_rate_rounds Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffVERY_SLOW_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffvery_slow_rate_rounds Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Tff7b72selfTff7b72.Td2a8ffvery_slow_rate_rounds Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffVERY_SLOW_RATE_THRESHOLDTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwindow_max Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAX_VERY_SLOW
Tff7b72selfTff7b72.Td2a8ffrequest_nextTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceiving_part Tff7b72= Tff7b72False
T8b949e# Called on incoming resource to send a request for more data
Tff7b72def Td2a8ffrequest_nextTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffreceiving_partTb4b4b4:
Te6edf3sleepTb4b4b4(T79c0ff0.001Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmuTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72= T79c0ff0
Te6edf3hashmap_exhausted Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_NOT_EXHAUSTED
Te6edf3requested_hashes Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3pn Tff7b72= Tff7b72selfTff7b72.Td2a8ffconsecutive_completed_heightTff7b72+T79c0ff1
Te6edf3search_start Tff7b72= Te6edf3pn
Te6edf3search_size Tff7b72= Tff7b72selfTff7b72.Td2a8ffwindow
Tff7b72for Te6edf3part Tff7b72in Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3search_startTb4b4b4:Te6edf3search_startTff7b72+Te6edf3search_sizeTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3part Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3part_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3pnTb4b4b4]
Tff7b72if Te6edf3part_hash Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3requested_hashes Tff7b72+Tff7b72= Te6edf3part_hash
Tff7b72selfTff7b72.Td2a8ffoutstanding_parts Tff7b72+Tff7b72= T79c0ff1
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Te6edf3hashmap_exhausted Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_EXHAUSTED
Te6edf3pn Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3i Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffwindow Tff7b72or Te6edf3hashmap_exhausted Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_EXHAUSTEDTb4b4b4:
Tff7b72break
Te6edf3hmu_part Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3hashmap_exhaustedTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3hashmap_exhausted Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_EXHAUSTEDTb4b4b4:
Te6edf3last_map_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Tff7b72selfTff7b72.Td2a8ffhashmap_heightTff7b72-T79c0ff1Tb4b4b4]
Te6edf3hmu_part Tff7b72+Tff7b72= Te6edf3last_map_hash
Tff7b72selfTff7b72.Td2a8ffwaiting_for_hmu Tff7b72= Tff7b72True
Te6edf3request_data Tff7b72= Te6edf3hmu_part Tff7b72+ Tff7b72selfTff7b72.Td2a8ffhash Tff7b72+ Te6edf3requested_hashes
Te6edf3request_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3request_dataTb4b4b4, Te6edf3context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_REQTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffensure_linkTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Te6edf3request_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreq_sent Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Tff7b72selfTff7b72.Td2a8ffreq_sent_bytes Tff7b72= Tffa657lenTb4b4b4(Te6edf3request_packetTff7b72.Td2a8ffrawTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes_at_part_req Tff7b72= Tff7b72selfTff7b72.Td2a8ffrtt_rxd_bytes
Tff7b72selfTff7b72.Td2a8ffreq_resp Tff7b72= Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send resource request packet, cancelling resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
T8b949e# Called on outgoing resource to make it send more data
Tff7b72def Td2a8ffrequestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffFAILEDTb4b4b4:
Te6edf3rtt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ffadv_sent
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrtt Tff7b72= Te6edf3rtt
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRINGTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffTRANSFERRING
Tff7b72selfTff7b72.Td2a8ffwatchdog_jobTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_retries
Te6edf3wants_more_hashmap Tff7b72= Tff7b72True Tff7b72if Te6edf3request_dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffHASHMAP_IS_EXHAUSTED Tff7b72else Tff7b72False
Te6edf3pad Tff7b72= T79c0ff1Tff7b72+Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LEN Tff7b72if Te6edf3wants_more_hashmap Tff7b72else T79c0ff1
Te6edf3requested_hashes Tff7b72= Te6edf3request_dataTb4b4b4[Te6edf3padTff7b72+Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffHASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:Tb4b4b4]
T8b949e# Define the search scope
Te6edf3search_start Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_height
Te6edf3search_end Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_heightTff7b72+Te6edf3ResourceAdvertisementTff7b72.Td2a8ffCOLLISION_GUARD_SIZE
Te6edf3map_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4,Tffa657lenTb4b4b4(Te6edf3requested_hashesTb4b4b4)Tff7b72/Tff7b72/Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4)Tb4b4b4:
Te6edf3map_hash Tff7b72= Te6edf3requested_hashesTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]
Te6edf3map_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3map_hashTb4b4b4)
Te6edf3search_scope Tff7b72= Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3search_startTb4b4b4:Te6edf3search_endTb4b4b4]
Te6edf3requested_parts Tff7b72= Tffa657listTb4b4b4(Tffa657filterTb4b4b4(Tff7b72lambda Te6edf3partTb4b4b4: Te6edf3partTff7b72.Td2a8ffmap_hash Tff7b72in Te6edf3map_hashesTb4b4b4, Te6edf3search_scopeTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3part Tff7b72in Te6edf3requested_partsTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffensure_linkTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Tff7b72if Tff7b72not Te6edf3partTff7b72.Td2a8ffsentTb4b4b4:
Te6edf3partTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsent_parts Tff7b72+Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4: Te6edf3partTff7b72.Td2a8ffresendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_part_sent Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_activity
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource could not send parts, cancelling transfer!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3wants_more_hashmapTb4b4b4:
Te6edf3last_map_hash Tff7b72= Te6edf3request_dataTb4b4b4[T79c0ff1Tb4b4b4:Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTff7b72+T79c0ff1Tb4b4b4]
Te6edf3part_index Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_height
Te6edf3search_start Tff7b72= Te6edf3part_index
Te6edf3search_end Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_heightTff7b72+Te6edf3ResourceAdvertisementTff7b72.Td2a8ffCOLLISION_GUARD_SIZE
Tff7b72for Te6edf3part Tff7b72in Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4[Te6edf3search_startTb4b4b4:Te6edf3search_endTb4b4b4]Tb4b4b4:
Te6edf3part_index Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3partTff7b72.Td2a8ffmap_hash Tff7b72== Te6edf3last_map_hashTb4b4b4: Tff7b72break
Tff7b72selfTff7b72.Td2a8ffreceiver_min_consecutive_height Tff7b72= Tffa657maxTb4b4b4(Te6edf3part_indexTff7b72-T79c0ff1Tff7b72-Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAXTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3part_index Tff7b72% Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource sequencing error, cancelling transfer!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72return
Tff7b72elseTb4b4b4: Te6edf3segment Tff7b72= Te6edf3part_index Tff7b72/Tff7b72/ Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN
Te6edf3hashmap_start Tff7b72= Te6edf3segmentTff7b72*Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN
Te6edf3hashmap_end Tff7b72= Tffa657minTb4b4b4(Tb4b4b4(Te6edf3segmentTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LENTb4b4b4, Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4)Tb4b4b4)
Te6edf3hashmap Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3hashmap_startTb4b4b4,Te6edf3hashmap_endTb4b4b4)Tb4b4b4:
Te6edf3hashmap Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashmapTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]
Tff7b72if Tff7b72not Te6edf3hashmapTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource HMU error, cancelling transfer!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72return
Te6edf3hmu Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72+Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Te6edf3segmentTb4b4b4, Te6edf3hashmapTb4b4b4]Tb4b4b4)
Te6edf3hmu_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3hmuTb4b4b4, Te6edf3context Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_HMUTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffensure_linkTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return
Te6edf3hmu_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_activity Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send resource HMU packet, cancelling resourceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72if Te6edf3RNSTff7b72.Td2a8ffslTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsent_parts Tff7b72== Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpartsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffAWAITING_PROOF
Tff7b72selfTff7b72.Td2a8ffretries_left Tff7b72= T79c0ff3
Tff7b72if Tff7b72selfTff7b72.Td2a8ff__progress_callback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ff__progress_callbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing progress callback from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffcancelTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
Cancels transferring the resource.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnext_segmentTb4b4b4: Tff7b72selfTff7b72.Td2a8ffnext_segmentTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3ResourceTff7b72.Td2a8ffCORRUPTTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffcancel_incoming_resourceTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrejectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffadvertisement_packetTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffFAILED
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3cancel_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_ICLTb4b4b4)
Te6edf3cancel_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send resource cancel packet, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffcancel_outgoing_resourceTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3cancel_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4, Te6edf3contextTff7b72=Te6edf3RNSTff7b72.Td2a8ffPacketTff7b72.Td2a8ffRESOURCE_RCLTb4b4b4)
Te6edf3cancel_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not send resource cancel packet, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffcancel_incoming_resourceTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing callbacks on resource cancel from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ff_rejectedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72< Te6edf3ResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3ResourceTff7b72.Td2a8ffREJECTED
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffcancel_outgoing_resourceTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Tff7b72selfTb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while executing callbacks on resource reject from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffset_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffprogress_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff__progress_callback Tff7b72= Te6edf3callback
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnext_segmentTb4b4b4: Tff7b72selfTff7b72.Td2a8ffnext_segmentTff7b72.Td2a8ffprogress_callbackTb4b4b4(Te6edf3callbackTb4b4b4)
Tff7b72def Td2a8ffget_progressTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The current progress of the resource transfer as a *float* between 0.0 and 1.0.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETE Tff7b72and Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72== Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4:
Tff7b72return T79c0ff1.0
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsplitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72= Tff7b72selfTff7b72.Td2a8ffsent_parts
Tff7b72selfTff7b72.Td2a8ffprogress_total_parts Tff7b72= Tffa657floatTb4b4b4(Tff7b72selfTff7b72.Td2a8fftotal_partsTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3is_last_segment Tff7b72= Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72!= Tff7b72selfTff7b72.Td2a8fftotal_segments
Te6edf3total_segments Tff7b72= Tff7b72selfTff7b72.Td2a8fftotal_segments
Te6edf3processed_segments Tff7b72= Tff7b72selfTff7b72.Td2a8ffsegment_indexTff7b72-T79c0ff1
Te6edf3current_segment_parts Tff7b72= Tff7b72selfTff7b72.Td2a8fftotal_parts
Te6edf3max_parts_per_segment Tff7b72= Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETff7b72/Tff7b72selfTff7b72.Td2a8ffsduTb4b4b4)
Te6edf3previously_processed_parts Tff7b72= Te6edf3processed_segmentsTff7b72*Te6edf3max_parts_per_segment
Tff7b72if Te6edf3current_segment_parts Tff7b72< Te6edf3max_parts_per_segmentTb4b4b4:
Te6edf3current_segment_factor Tff7b72= Te6edf3max_parts_per_segment Tff7b72/ Te6edf3current_segment_parts
Tff7b72elseTb4b4b4:
Te6edf3current_segment_factor Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72= Te6edf3previously_processed_parts Tff7b72+ Tff7b72selfTff7b72.Td2a8ffsent_partsTff7b72*Te6edf3current_segment_factor
Tff7b72selfTff7b72.Td2a8ffprogress_total_parts Tff7b72= Tff7b72selfTff7b72.Td2a8fftotal_segmentsTff7b72*Te6edf3max_parts_per_segment
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffsplitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceived_count
Tff7b72selfTff7b72.Td2a8ffprogress_total_parts Tff7b72= Tffa657floatTb4b4b4(Tff7b72selfTff7b72.Td2a8fftotal_partsTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3is_last_segment Tff7b72= Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72!= Tff7b72selfTff7b72.Td2a8fftotal_segments
Te6edf3total_segments Tff7b72= Tff7b72selfTff7b72.Td2a8fftotal_segments
Te6edf3processed_segments Tff7b72= Tff7b72selfTff7b72.Td2a8ffsegment_indexTff7b72-T79c0ff1
Te6edf3current_segment_parts Tff7b72= Tff7b72selfTff7b72.Td2a8fftotal_parts
Te6edf3max_parts_per_segment Tff7b72= Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETff7b72/Tff7b72selfTff7b72.Td2a8ffsduTb4b4b4)
Te6edf3previously_processed_parts Tff7b72= Te6edf3processed_segmentsTff7b72*Te6edf3max_parts_per_segment
Tff7b72if Te6edf3current_segment_parts Tff7b72< Te6edf3max_parts_per_segmentTb4b4b4:
Te6edf3current_segment_factor Tff7b72= Te6edf3max_parts_per_segment Tff7b72/ Te6edf3current_segment_parts
Tff7b72elseTb4b4b4:
Te6edf3current_segment_factor Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72= Te6edf3previously_processed_parts Tff7b72+ Tff7b72selfTff7b72.Td2a8ffreceived_countTff7b72*Te6edf3current_segment_factor
Tff7b72selfTff7b72.Td2a8ffprogress_total_parts Tff7b72= Tff7b72selfTff7b72.Td2a8fftotal_segmentsTff7b72*Te6edf3max_parts_per_segment
Te6edf3progress Tff7b72= Tffa657minTb4b4b4(T79c0ff1.0Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffprocessed_parts Tff7b72/ Tff7b72selfTff7b72.Td2a8ffprogress_total_partsTb4b4b4)
Tff7b72return Te6edf3progress
Tff7b72def Td2a8ffget_segment_progressTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETE Tff7b72and Tff7b72selfTff7b72.Td2a8ffsegment_index Tff7b72== Tff7b72selfTff7b72.Td2a8fftotal_segmentsTb4b4b4:
Tff7b72return T79c0ff1.0
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffinitiatorTb4b4b4:
Te6edf3processed_parts Tff7b72= Tff7b72selfTff7b72.Td2a8ffsent_parts
Tff7b72elseTb4b4b4:
Te6edf3processed_parts Tff7b72= Tff7b72selfTff7b72.Td2a8ffreceived_count
Te6edf3progress Tff7b72= Tffa657minTb4b4b4(T79c0ff1.0Tb4b4b4, Te6edf3processed_parts Tff7b72/ Tff7b72selfTff7b72.Td2a8fftotal_partsTb4b4b4)
Tff7b72return Te6edf3progress
Tff7b72def Td2a8ffget_transfer_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The number of bytes needed to transfer the resource.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffsize
Tff7b72def Td2a8ffget_data_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The total data size of the resource.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8fftotal_size
Tff7b72def Td2a8ffget_partsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The number of parts the resource will be transferred in.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8fftotal_parts
Tff7b72def Td2a8ffget_segmentsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The number of segments the resource is divided into.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8fftotal_segments
Tff7b72def Td2a8ffget_hashTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: The hash of the resource.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffhash
Tff7b72def Td2a8ffis_compressedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
:returns: Whether the resource is compressed.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffcompressed
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhashTb4b4b4,Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8fflink_idTb4b4b4,Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72class T56d364ResourceAdvertisementTb4b4b4:
Te6edf3OVERHEAD Tff7b72= T79c0ff134
Te6edf3HASHMAP_MAX_LEN Tff7b72= Te6edf3mathTff7b72.Td2a8fffloorTb4b4b4(Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffMDUTff7b72-Te6edf3OVERHEADTb4b4b4)Tff7b72/Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4)
Te6edf3COLLISION_GUARD_SIZE Tff7b72= T79c0ff2Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffWINDOW_MAXTff7b72+Te6edf3HASHMAP_MAX_LEN
Tff7b72assert Te6edf3HASHMAP_MAX_LEN Tff7b72> T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffThe configured MTU is too small to include any map hashes in resource advertismentsTa5d6ff"
Tf0883e@staticmethod
Tff7b72def Td2a8ffis_requestTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72if Te6edf3advTff7b72.Td2a8ffq Tff7b72!= Tff7b72None Tff7b72and Te6edf3advTff7b72.Td2a8ffuTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffis_responseTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72if Te6edf3advTff7b72.Td2a8ffq Tff7b72!= Tff7b72None Tff7b72and Te6edf3advTff7b72.Td2a8ffpTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72False
Tf0883e@staticmethod
Tff7b72def Td2a8ffread_request_idTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72return Te6edf3advTff7b72.Td2a8ffq
Tf0883e@staticmethod
Tff7b72def Td2a8ffread_transfer_sizeTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72return Te6edf3advTff7b72.Td2a8fft
Tf0883e@staticmethod
Tff7b72def Td2a8ffread_sizeTb4b4b4(Te6edf3advertisement_packetTb4b4b4)Tb4b4b4:
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTff7b72.Td2a8ffunpackTb4b4b4(Te6edf3advertisement_packetTff7b72.Td2a8ffplaintextTb4b4b4)
Tff7b72return Te6edf3advTff7b72.Td2a8ffd
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTff7b72=Tff7b72NoneTb4b4b4, Te6edf3request_idTff7b72=Tff7b72NoneTb4b4b4, Te6edf3is_responseTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72if Te6edf3resource Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fft Tff7b72= Te6edf3resourceTff7b72.Td2a8ffsize T8b949e# Transfer size
Tff7b72selfTff7b72.Td2a8ffd Tff7b72= Te6edf3resourceTff7b72.Td2a8fftotal_size T8b949e# Total uncompressed data size
Tff7b72selfTff7b72.Td2a8ffn Tff7b72= Tffa657lenTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffpartsTb4b4b4) T8b949e# Number of parts
Tff7b72selfTff7b72.Td2a8ffh Tff7b72= Te6edf3resourceTff7b72.Td2a8ffhash T8b949e# Resource hash
Tff7b72selfTff7b72.Td2a8ffr Tff7b72= Te6edf3resourceTff7b72.Td2a8ffrandom_hash T8b949e# Resource random hash
Tff7b72selfTff7b72.Td2a8ffo Tff7b72= Te6edf3resourceTff7b72.Td2a8fforiginal_hash T8b949e# First-segment hash
Tff7b72selfTff7b72.Td2a8ffm Tff7b72= Te6edf3resourceTff7b72.Td2a8ffhashmap T8b949e# Resource hashmap
Tff7b72selfTff7b72.Td2a8ffc Tff7b72= Te6edf3resourceTff7b72.Td2a8ffcompressed T8b949e# Compression flag
Tff7b72selfTff7b72.Td2a8ffe Tff7b72= Te6edf3resourceTff7b72.Td2a8ffencrypted T8b949e# Encryption flag
Tff7b72selfTff7b72.Td2a8ffs Tff7b72= Te6edf3resourceTff7b72.Td2a8ffsplit T8b949e# Split flag
Tff7b72selfTff7b72.Td2a8ffx Tff7b72= Te6edf3resourceTff7b72.Td2a8ffhas_metadata T8b949e# Metadata flag
Tff7b72selfTff7b72.Td2a8ffi Tff7b72= Te6edf3resourceTff7b72.Td2a8ffsegment_index T8b949e# Segment index
Tff7b72selfTff7b72.Td2a8ffl Tff7b72= Te6edf3resourceTff7b72.Td2a8fftotal_segments T8b949e# Total segments
Tff7b72selfTff7b72.Td2a8ffq Tff7b72= Te6edf3resourceTff7b72.Td2a8ffrequest_id T8b949e# ID of associated request
Tff7b72selfTff7b72.Td2a8ffu Tff7b72= Tff7b72False T8b949e# Is request flag
Tff7b72selfTff7b72.Td2a8ffp Tff7b72= Tff7b72False T8b949e# Is response flag
Tff7b72if Tff7b72selfTff7b72.Td2a8ffq Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3resourceTff7b72.Td2a8ffis_responseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffu Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffp Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffu Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffp Tff7b72= Tff7b72True
T8b949e# Flags
Tff7b72selfTff7b72.Td2a8fff Tff7b72= T79c0ff0x00 Tff7b72| Tff7b72selfTff7b72.Td2a8ffx Tff7b72<< T79c0ff5 Tff7b72| Tff7b72selfTff7b72.Td2a8ffp Tff7b72<< T79c0ff4 Tff7b72| Tff7b72selfTff7b72.Td2a8ffu Tff7b72<< T79c0ff3 Tff7b72| Tff7b72selfTff7b72.Td2a8ffs Tff7b72<< T79c0ff2 Tff7b72| Tff7b72selfTff7b72.Td2a8ffc Tff7b72<< T79c0ff1 Tff7b72| Tff7b72selfTff7b72.Td2a8ffe
Tff7b72def Td2a8ffget_transfer_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8fft
Tff7b72def Td2a8ffget_data_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffd
Tff7b72def Td2a8ffget_partsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffn
Tff7b72def Td2a8ffget_segmentsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffl
Tff7b72def Td2a8ffget_hashTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffh
Tff7b72def Td2a8ffis_compressedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffc
Tff7b72def Td2a8ffhas_metadataTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffx
Tff7b72def Td2a8ffget_linkTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8fflink
Tff7b72def Td2a8ffpackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3segmentTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4:
Te6edf3hashmap_start Tff7b72= Te6edf3segmentTff7b72*Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LEN
Te6edf3hashmap_end Tff7b72= Tffa657minTb4b4b4(Tb4b4b4(Te6edf3segmentTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Tb4b4b4(Te6edf3ResourceAdvertisementTff7b72.Td2a8ffHASHMAP_MAX_LENTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffnTb4b4b4)
Te6edf3hashmap Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3hashmap_startTb4b4b4,Te6edf3hashmap_endTb4b4b4)Tb4b4b4:
Te6edf3hashmap Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffmTb4b4b4[Te6edf3iTff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4:Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72*Te6edf3ResourceTff7b72.Td2a8ffMAPHASH_LENTb4b4b4]
Te6edf3dictionary Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6fftTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fftTb4b4b4, T8b949e# Transfer size
Ta5d6ff"Ta5d6ffdTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdTb4b4b4, T8b949e# Data size
Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffnTb4b4b4, T8b949e# Number of parts
Ta5d6ff"Ta5d6ffhTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhTb4b4b4, T8b949e# Resource hash
Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrTb4b4b4, T8b949e# Resource random hash
Ta5d6ff"Ta5d6ffoTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffoTb4b4b4, T8b949e# Original hash
Ta5d6ff"Ta5d6ffiTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffiTb4b4b4, T8b949e# Segment index
Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fflTb4b4b4, T8b949e# Total segments
Ta5d6ff"Ta5d6ffqTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffqTb4b4b4, T8b949e# Request ID
Ta5d6ff"Ta5d6fffTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8fffTb4b4b4, T8b949e# Resource flags
Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4: Te6edf3hashmap Tb4b4b4}
Tff7b72return Te6edf3umsgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3dictionaryTb4b4b4)
Tf0883e@staticmethod
Tff7b72def Td2a8ffunpackTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3dictionary Tff7b72= Te6edf3umsgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3adv Tff7b72= Te6edf3ResourceAdvertisementTb4b4b4(Tb4b4b4)
Te6edf3advTff7b72.Td2a8fft Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fftTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffd Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffdTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffn Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffh Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffhTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffr Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffo Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffoTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffm Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffmTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8fff Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fffTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffi Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffiTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffl Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffq Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffqTa5d6ff"Tb4b4b4]
Te6edf3advTff7b72.Td2a8ffe Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffc Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff1Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffs Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff2Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffu Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff3Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffp Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff4Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Te6edf3advTff7b72.Td2a8ffx Tff7b72= Tff7b72True Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3advTff7b72.Td2a8fff Tff7b72>> T79c0ff5Tb4b4b4) Tff7b72& T79c0ff0x01Tb4b4b4) Tff7b72== T79c0ff0x01 Tff7b72else Tff7b72False
Tff7b72if Te6edf3advTff7b72.Td2a8fft Tff7b72> Te6edf3ResourceTff7b72.Td2a8ffMAX_EFFICIENT_SIZETff7b72*T79c0ff3Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid transfer sizeTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3adv
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────